home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
426-450
/
disk_441
/
dme
/
src
/
cmd3.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-05-06
|
7KB
|
458 lines
/*
* CMD3.C
*
* (C)Copyright 1988 by Matthew Dillon, All Rights Reserved
*
* SETFONT
* IGNORECASE
* SET
* SETENV
* UNSET
* UNSETENV
* CD
* SAVECONFIG
* FGPEN
* TPEN
* BGPEN
* TITLE
* JUSTIFY
* UNJUSTIFY
* MODIFIED
* UNDELINE
*/
#include "defs.h"
Prototype void do_setfont (void);
Prototype void do_ignorecase (void);
Prototype void do_cd (void);
Prototype void do_set (void);
Prototype void do_setenv (void);
Prototype void do_unset (void);
Prototype void do_unsetenv (void);
Prototype char *getvar (char *);
Prototype void loadconfig(ED *);
Prototype void do_saveconfig(void);
Prototype void do_fgpen(void);
Prototype void do_bgpen(void);
Prototype void do_hgpen(void);
Prototype void do_tpen(void);
Prototype void do_justify(void);
Prototype void do_title(void);
Prototype void do_undeline(void);
Prototype void do_unjustify(void);
Prototype void do_modified(void);
#define nomemory() { memoryfail = 1; }
/*
* SETFONT font size
*/
void
do_setfont()
{
FONT *font = (FONT *)GetFont(av[1], (short)atoi(av[2]));
ED *ep = Ep;
if (font) {
text_sync();
if (ep->Font)
CloseFont(ep->Font);
ep->Font = font;
SetFont(ep->Win->RPort, font);
SetRast(ep->Win->RPort, 0);
RefreshWindowFrame(ep->Win);
set_window_params();
text_redisplay();
} else {
title("Unable to find font");
}
}
void
do_ignorecase()
{
ED *ep = Ep;
if (av[1][0]) {
switch(av[1][1] & 0x1F) {
case 'n'&0x1F:
ep->IgnoreCase = 1;
break;
case 'f'&0x1F:
ep->IgnoreCase = 0;
break;
case 'o'&0x1F:
ep->IgnoreCase = 1 - ep->IgnoreCase;
break;
}
if (ep->IgnoreCase)
title("Case InSensitive");
else
title("Case Sensitive");
}
}
/*
* av[1]
*/
void
do_cd()
{
BPTR oldlock;
BPTR lock;
oldlock = CurrentDir((BPTR)Ep->dirlock);
if (lock = Lock(av[1], SHARED_LOCK)) {
UnLock(CurrentDir(oldlock));
Ep->dirlock = (long)lock;
} else {
CurrentDir(oldlock);
Abortcommand = 1;
title("Unable to CD");
}
}
/*
* VARIABLE SUPPORT!
*/
#define VARS struct _VARS
VARS {
MNODE Node;
char *Name;
char *Str;
};
static MLIST SList = { (MNODE *)&SList.mlh_Tail, NULL, (MNODE *)&SList.mlh_Head };
void
do_set()
{
VARS *v;
void do_unset();
do_unset();
if (v = malloc(sizeof(VARS))) {
if (v->Name = malloc(strlen(av[1])+1)) {
if (v->Str = malloc(strlen(av[2])+1)) {
AddHead((LIST *)&SList, (NODE *)v);
strcpy(v->Name, av[1]);
strcpy(v->Str , av[2]);
return;
}
free(v->Name);
}
free(v);
}
nomemory();
}
void
do_setenv()
{
SetDEnv(av[1], av[2]);
}
void
do_unset()
{
VARS *v;
for (v = (VARS *)SList.mlh_Head; v->Node.mln_Succ; v = (VARS *)v->Node.mln_Succ) {
if (strcmp(v->Name, av[1]) == 0) {
Remove((NODE *)v);
free(v);
free(v->Name);
free(v->Str);
break;
}
}
}
void
do_unsetenv()
{
char *ptr = (char *)av[1];
char *tmp = malloc(4+strlen(ptr)+1);
if (tmp) {
strcpy(tmp, "ENV:");
strcat(tmp, ptr);
mountrequest(0);
DeleteFile(tmp);
mountrequest(1);
free(tmp);
}
}
/*
* Search (1) internal list, (2) enviroment, (3) macros. The variable
* is allocated with malloc(). NULL if not found. ENV: need not exist.
*/
char *
getvar(find)
char *find;
{
char *str = NULL;
{
VARS *v;
for (v = (VARS *)SList.mlh_Head; v->Node.mln_Succ; v = (VARS *)v->Node.mln_Succ) {
if (strcmp(v->Name, find) == 0) {
if (str = malloc(strlen(v->Str)+1)) {
strcpy(str, v->Str);
return(str);
}
}
}
}
mountrequest(0);
str = (char *)GetDEnv(find);
mountrequest(1);
if (str)
return(str);
if ((str = keyspectomacro(find)) || (str = menutomacro(find))) {
char *ptr = malloc(strlen(str)+1);
if (ptr) {
strcpy(ptr, str);
return(ptr);
}
}
return(NULL);
}
void
do_col()
{
int col;
{
char *ptr = av[1];
switch(*ptr) {
case '+':
col = text_colno() + atoi(ptr + 1);
if (col > 254)
col = 254;
break;
case '-':
col = text_colno() + atoi(ptr);
if (col < 0)
col = 0;
break;
default:
col = atoi(ptr) - 1;
break;
}
}
if (col > 254 || col < 0) {
Abortcommand = 1;
return;
}
while (Clen < col)
Current[Clen++] = ' ';
Current[Clen] = 0;
Ep->Column = col;
if (Ep->Column - Ep->Topcolumn >= Columns || Ep->Column < Ep->Topcolumn)
text_sync();
}
void
do_saveconfig()
{
ED *ep = Ep;
FILE *fi;
if (ep->iconmode == 0) {
WIN *win = ep->Win;
ep->Winx = win->LeftEdge;
ep->Winy = win->TopEdge;
ep->Winwidth = win->Width;
ep->Winheight = win->Height;
}
if (fi = fopen("s:dme.config", "w")) {
fwrite(&ep->BeginConfig, (char *)&ep->EndConfig - (char *)&ep->BeginConfig, 1, fi);
fclose(fi);
}
}
void
loadconfig(ep)
ED *ep;
{
FILE *fi;
if (fi = fopen("s:dme.config", "r")) {
fread(&ep->BeginConfig, (char *)&ep->EndConfig - (char *)&ep->BeginConfig, 1, fi);
fclose(fi);
}
}
void
do_fgpen()
{
ED *ep = Ep;
ep->FGPen = atoi(av[1]);
}
void
do_tpen()
{
ED *ep = Ep;
ep->TPen = atoi(av[1]);
}
void
do_bgpen()
{
ED *ep = Ep;
ep->BGPen = atoi(av[1]);
}
void
do_hgpen()
{
ED *ep = Ep;
ep->HGPen = atoi(av[1]);
}
/*
* Commands submitted by Markus Wenzel
*/
void
do_undeline()
{
do_insline();
text_load();
strcpy(Current, Deline);
text_sync();
text_displayseg(Ep->Line - Ep->Topline, 1);
}
void
do_modified()
{
register ED *ep = Ep;
if (av[1][0]) {
switch(av[1][1] & 0x1F) {
case 'n' & 0x1F:
ep->Modified = 1;
break;
case 'f' & 0x1F:
ep->Modified = 0;
break;
case 'o' & 0x1F:
ep->Modified = ep->Modified ? 0 : 1;
break;
}
}
}
void
do_unjustify()
{
short i, j, waswhite = FALSE;
ubyte c;
for (i = 0; Current[i] == ' '; i++);
for (j = i; Current[i]; i++) {
c = Current[j] = Current[i];
if (c != ' ' || !waswhite)
j++;
waswhite = (c == ' ');
}
Current[j] = 0;
if (i != j) {
text_sync();
text_redisplaycurrline();
}
}
void
do_justify()
{
ED *ep = Ep;
short firstnb, lastnb, i, n, fill, c, sp;
short changed = FALSE;
switch(av[1][0]) {
case 'c':
break;
case 'f':
firstnb = firstns(Current);
lastnb = lastns(Current);
if (firstnb < lastnb && ep->Margin < 255) {
n = 0;
i = firstnb;
while (i <= lastnb) {
while ((c = Current[i]) && c != ' ')
i++;
if (i <= lastnb) {
n++;
while (Current[i] == ' ')
i++;
}
}
fill = ep->Margin - lastnb - 1;
i = firstnb;
Current[lastnb + 1] = 0;
if (n > 0 && fill > 0)
changed = TRUE;
while (n > 0 && fill > 0 && Current[i]) {
while ((c = Current[i]) && c != ' ')
i++;
sp = fill / n;
movmem(&Current[i], &Current[i + sp], strlen(&Current[i]) + 1);
memset(&Current[i], ' ', sp);
while (Current[i] == ' ')
i++;
fill -= sp;
n--;
}
}
break;
default:
break;
}
if (changed) {
text_sync();
text_redisplaycurrline();
}
}
void
do_title()
{
static ubyte wtitle[256];
strncpy(wtitle, av[1], 255);
wtitle[255] = 0;
title(wtitle);
}